package view.steine;

import java.awt.Point;

import model.menupages.Gamepage;

public class Spielblock_violett extends Spielblock {

	// der violette Spielblock ist das umgedrehte T
	// der feste Spielblock befindet sich unten in der Mitte
	public Spielblock_violett(Standardblock standardblock) {
		super(standardblock);
	}

	@Override
	public boolean doChecks(Standardblock[][] vorhandeneSpielsteine, int dir) {
		int x = (int) getPos().getX();
		int y = (int) getPos().getY() - 1;
		switch (drehung) {
		case OBEN:
			switch (dir) {
			case Spielblock.DOWN:
				if (y == 0) {
					return false;
				}
				if (vorhandeneSpielsteine[x][y - 1] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.LEFT:
				if (x == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x - 2][y] == null
						&& vorhandeneSpielsteine[x - 1][y + 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.RIGHT:
				if (x >= 8) {
					return false;
				}
				if (vorhandeneSpielsteine[x + 2][y] == null
						&& vorhandeneSpielsteine[x + 1][y + 1] == null) {
					return true;
				} else {
					return false;
				}
			}
			break;
		case RECHTS:
			switch (dir) {
			case Spielblock.DOWN:
				if (y == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x][y - 2] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.LEFT:
				if (x == 0) {
					return false;
				}
				if (vorhandeneSpielsteine[x - 1][y] == null
						&& vorhandeneSpielsteine[x - 1][y + 1] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.RIGHT:
				if (x >= 10) {
					return false;
				}
				if (vorhandeneSpielsteine[x + 2][y] == null
						&& vorhandeneSpielsteine[x + 1][y + 1] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			}
			break;
		case UNTEN:
			switch (dir) {
			case Spielblock.DOWN:
				if (y == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x][y - 2] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.LEFT:
				if (x == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x - 2][y] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.RIGHT:
				if (x >= 9) {
					return false;
				}
				if (vorhandeneSpielsteine[x + 2][y] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			}
			break;
		case LINKS:
			switch (dir) {
			case Spielblock.DOWN:
				if (y == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x][y - 2] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.LEFT:
				if (x == 1) {
					return false;
				}
				if (vorhandeneSpielsteine[x - 2][y] == null
						&& vorhandeneSpielsteine[x - 1][y + 1] == null
						&& vorhandeneSpielsteine[x - 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			case Spielblock.RIGHT:
				if (x >= 9) {
					return false;
				}
				if (vorhandeneSpielsteine[x + 1][y] == null
						&& vorhandeneSpielsteine[x + 1][y + 1] == null
						&& vorhandeneSpielsteine[x + 1][y - 1] == null) {
					return true;
				} else {
					return false;
				}
			}
			break;

		}

		return true;

	}

	@Override
	public void show(Gamepage gamepage) {
		int x = (int) getPos().getX();
		int y = (int) getPos().getY();

		switch (drehung) {
		case OBEN:
			getStandardblock().draw(x, y, gamepage);
			getStandardblock().draw(x, y + 1, gamepage);
			getStandardblock().draw(x + 1, y, gamepage);
			getStandardblock().draw(x - 1, y, gamepage);
			break;
		case RECHTS:
			getStandardblock().draw(x, y, gamepage);
			getStandardblock().draw(x + 1, y, gamepage);
			getStandardblock().draw(x, y + 1, gamepage);
			getStandardblock().draw(x, y - 1, gamepage);
			break;
		case UNTEN:
			getStandardblock().draw(x, y, gamepage);
			getStandardblock().draw(x, y - 1, gamepage);
			getStandardblock().draw(x - 1, y, gamepage);
			getStandardblock().draw(x + 1, y, gamepage);
			break;
		case LINKS:
			getStandardblock().draw(x, y, gamepage);
			getStandardblock().draw(x - 1, y, gamepage);
			getStandardblock().draw(x, y + 1, gamepage);
			getStandardblock().draw(x, y - 1, gamepage);
			break;

		}

	}

	@Override
	public void remove(Gamepage gamepage) {

		double x = getPos().getX();
		double y = getPos().getY();
		switch (drehung) {
		case OBEN:
			getStandardblock().remove(x, y, gamepage);
			getStandardblock().remove(x, y + 1, gamepage);
			getStandardblock().remove(x + 1, y, gamepage);
			getStandardblock().remove(x - 1, y, gamepage);
			break;
		case RECHTS:
			getStandardblock().remove(x, y, gamepage);
			getStandardblock().remove(x + 1, y, gamepage);
			getStandardblock().remove(x, y + 1, gamepage);
			getStandardblock().remove(x, y - 1, gamepage);
			break;
		case UNTEN:
			getStandardblock().remove(x, y, gamepage);
			getStandardblock().remove(x, y - 1, gamepage);
			getStandardblock().remove(x - 1, y, gamepage);
			getStandardblock().remove(x + 1, y, gamepage);
			break;
		case LINKS:
			getStandardblock().remove(x, y, gamepage);
			getStandardblock().remove(x - 1, y, gamepage);
			getStandardblock().remove(x, y + 1, gamepage);
			getStandardblock().remove(x, y - 1, gamepage);
			break;

		}
	}

	@Override
	public void setInArray(Standardblock[][] vorhandeneSpielsteine) {

		while (getPos().getY() > 19) {
			getPos().translate(0, -1);
		}
		int y = (int) getPos().getY();

		switch (drehung) {
		case OBEN:
			vorhandeneSpielsteine[(int) getPos().getX()][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() + 1][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() - 1][y - 1] = getStandardblock();
			break;
		case RECHTS:
			vorhandeneSpielsteine[(int) getPos().getX()][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() + 1][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y - 2] = getStandardblock();
			break;
		case UNTEN:
			vorhandeneSpielsteine[(int) getPos().getX()][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y - 2] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() - 1][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() + 1][y - 1] = getStandardblock();
			break;
		case LINKS:
			while (getPos().getY() + 1 > 19) {
				getPos().translate(0, -1);

			}
			y = (int) getPos().getY();
			vorhandeneSpielsteine[(int) getPos().getX()][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX() - 1][y - 1] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y] = getStandardblock();
			vorhandeneSpielsteine[(int) getPos().getX()][y - 2] = getStandardblock();
			break;

		}

	}

	@Override
	public void delOutOfArray(Standardblock[][] vorhandeneSpielsteine) {
		switch (drehung) {
		case OBEN:
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY()] = null;
			vorhandeneSpielsteine[(int) getPos().getX() + 1][(int) getPos()
					.getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX() - 1][(int) getPos()
					.getY() - 1] = null;
			break;
		case RECHTS:
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX() + 1][(int) getPos()
					.getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY()] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 2] = null;
			break;
		case UNTEN:
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 2] = null;
			vorhandeneSpielsteine[(int) getPos().getX() - 1][(int) getPos()
					.getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX() + 1][(int) getPos()
					.getY() - 1] = null;
			break;
		case LINKS:
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX() - 1][(int) getPos()
					.getY() - 1] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY()] = null;
			vorhandeneSpielsteine[(int) getPos().getX()][(int) getPos().getY() - 2] = null;
			break;

		}
	}

	@Override
	public boolean checkTurn(Standardblock[][] vorhandeneSpielsteine) {
		int x = (int) getPos().getX();
		int y = (int) getPos().getY();
		switch (drehung) {
		case OBEN:
			if (y <= 2) {
				return false;
			}
			if (vorhandeneSpielsteine[x][y - 2] == null){
				return true;
			}
				break;
		case RECHTS:
			if (x <= 0) {
				return false;
			}
			if (vorhandeneSpielsteine[x - 1][y -1] == null) {
				return true;
			}
			break;
		case UNTEN:
			if (y > 18) {
				return false;
			}
			if (vorhandeneSpielsteine[x][y] == null) {
				return true;
			}
			break;
		case LINKS:
			if (x >= 8) {
				return false;
			}
			if (vorhandeneSpielsteine[x + 1][y - 1] == null) {
				return true;
			}
			break;
		}
		return false;
	}

}